/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-06-29     17247       the first version
 *
 *    步骤 1：在 uart_protocol.h 中添加宏定义
 *      步骤 2：在 uart_protocol.c 的 swich(ctrl)中添加对应的case
 *      步骤3：在全局变量区添加新的存储变量
 */
#ifndef APPLICATIONS_UART_PROTOCOL_H_
#define APPLICATIONS_UART_PROTOCOL_H_

#include <rtthread.h>

/* 帧结构定义 */
#define FRAME_HEADER_1   0x53
#define FRAME_HEADER_2   0x59
#define FRAME_TAIL_1     0x54
#define FRAME_TAIL_2     0x43
/* 控制字定义 */
#define CTRL_SWITCH_FUNC  0x82  // 修改为 0x82，避免与 CTRL_HUMAN_EXIST 冲突
#define CTRL_HUMAN_EXIST  0x80  // 人体存在
#define CTRL_BREATHING    0x81  // 呼吸（运动信息）
#define CTRL_HEART_RATE   0x85  // 心率（体动参数）
#define CTRL_RADAR_RANGE  0x07  // 雷达范围（人体距离）
#define CTRL_BED_STATUS          0x86  // 入床/离床状态
#define CTRL_SLEEP_STATUS        0x87  // 睡眠状态
#define CTRL_AWAKE_DURATION      0x88  // 清醒时长
#define CTRL_LIGHT_SLEEP_DURATION 0x89  // 浅睡时长
#define CTRL_DEEP_SLEEP_DURATION 0x8A  // 深睡时长
#define CTRL_SLEEP_QUALITY_SCORE 0x8B  // 睡眠质量评分
#define CTRL_SLEEP_COMPREHENSIVE 0x8C  // 睡眠综合状态上报
#define CTRL_SLEEP_ANALYSIS      0x8D  // 睡眠质量分析上报

#define CMD_HEART_RATE_VALUE    0x02  // 心率数值上报
#define CMD_BREATHING_INFO     0x01  // 呼吸信息上报
#define CMD_BREATHING_VALUE    0x02  // 呼吸数值上报
#define CMD_BREATHING_WAVE     0x05  // 呼吸波形上报
#define CMD_BED_STATUS           0x01  // 入床/离床状态
#define CMD_SLEEP_STATUS         0x02  // 睡眠状态
#define CMD_AWAKE_DURATION       0x03  // 清醒时长
#define CMD_LIGHT_SLEEP_DURATION 0x04  // 浅睡时长
#define CMD_DEEP_SLEEP_DURATION  0x05  // 深睡时长
#define CMD_SLEEP_QUALITY_SCORE  0x06  // 睡眠质量评分
#define CMD_SLEEP_COMPREHENSIVE  0x0C  // 睡眠综合状态上报
#define CMD_SLEEP_ANALYSIS       0x0D  // 睡眠质量分析上报
/* 数据帧结构体 */
typedef struct {
    rt_uint8_t ctrl;
    rt_uint8_t cmd;
    rt_uint16_t len;
    rt_uint8_t data[256];
} FrameData;
const FrameData* get_global_frame_data(void);

/* 全局变量声明（供外部模块读取） */
extern rt_uint8_t global_exist_info;        // 存在信息
extern rt_uint8_t global_motion_info;       // 运动信息
extern rt_uint8_t global_body_movement;     // 体动参数
extern rt_uint16_t global_human_distance;   // 人体距离
extern rt_uint8_t global_heart_rate_value;  // 心率数值
extern rt_int16_t global_human_position_x;  // 人体方位 X
extern rt_int16_t global_human_position_y;  // 人体方位 Y
extern rt_int16_t global_human_position_z;  // 人体方位 Z
extern rt_uint8_t global_switch_func_status;// 开关人体存在功能状态
extern rt_uint8_t global_breathing_info;    // 呼吸信息
extern rt_uint8_t global_breathing_value;   // 呼吸数值
extern rt_uint8_t global_breathing_wave[5]; // 呼吸波形数据
extern rt_uint8_t global_bed_status;  // 入床/离床状态
extern rt_uint16_t global_awake_duration;  // 清醒时长
extern rt_uint16_t global_light_sleep_duration;  // 浅睡时长
extern rt_uint16_t global_deep_sleep_duration;  // 深睡时长
extern rt_uint8_t global_sleep_quality_score;  // 睡眠质量评分
extern rt_uint8_t global_sleep_status;  // 睡眠状态
extern rt_uint8_t global_sleep_comprehensive_data[8];  // 睡眠综合状态数据
extern rt_uint8_t global_sleep_analysis_data[12];  // 睡眠质量分析数据
/* 函数声明 */
rt_uint8_t calculate_checksum(const rt_uint8_t *data, rt_size_t len);
void parse_frame(const rt_uint8_t *buffer, rt_size_t length);
void parse_frame_from_buffer(void);
/* 回复帧发送函数声明（// 回复功能）*/
void send_reply_frame(rt_uint8_t ctrl, rt_uint8_t cmd, const rt_uint8_t *data, rt_uint16_t data_len);

#endif /* APPLICATIONS_UART_PROTOCOL_H_ */
